package tp1.arbolBmas.nodo;

import tp1.arbolBmas.nodo.dato.Dato;

public abstract class Nodo implements Comparable<Nodo> 
{
	protected Tipo tipo; //Derecho o Izquierdo
	protected Clave clave;
	protected Dato dato = null;
	
	protected Nodo padre; // En el caso de la raiz sera siempre null.Se sobreescriben los Getters y Setters sobre el padre.
	
	public Nodo() 
	{
		this.tipo = null;
		this.clave = null;
		this.dato = null;
		
		this.padre = null;
	}
	
	public Nodo(Tipo tipo, Clave clave, Dato dato, Nodo padre) 
	{
		super();
		this.tipo  = tipo;
		this.clave = clave;
		this.dato  = dato;
		this.padre = padre;
	}
	
	public Clave getClave() {
		return clave;
	}

	public void setClave(Clave clave) {
		this.clave = clave;
	}

	public Dato getDato() {
		return dato;
	}

	public void setDato(Dato dato) {
		this.dato = dato;
	}

	public Nodo getPadre() 
	{
		return padre;
	}

	public void setPadre(Nodo padre) 
	{
		this.padre = padre;
	}
	
	@Override
	public int compareTo(Nodo otroNodo) 
	{
		Clave otraClave = otroNodo.getClave();
		
		if( this.clave.esMenor( otraClave ) )
			return -1;
		else if ( this.clave.esMayor( otraClave ) )
			return 1;
		else
			return 0;
	}

	/**
	 * 
	 * @param nodo
	 * @return this.clave < nodo.clave
	 */
	public boolean esMenor(Nodo otroNodo) 
	{
		return this.getClave().esMenor( otroNodo.getClave() );
	}

	public boolean esHijoIzquierdo() 
	{
		return this.tipo.esHijoIzquierdo();
	}

	public boolean esHijoDerecho() 
	{
		return this.tipo.esHijoDerecho();
	}
}
